home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1992 June: ROMin Holiday / ADC Developer CD (1992-06) (''ROMin Holiday'')_iso / Developer Connection - 06-1992.iso / Developer Essentials / MPW Interfaces & Libraries / AIncludes / SANEMacs881.a < prev    next >
Encoding:
Text File  |  1992-01-29  |  32.5 KB  |  1,457 lines  |  [TEXT/MPS ]

  1. ; File: SANEMacs881.a
  2. ;
  3. ; Version 3.0
  4. ; Spawned from SANEMacs.a on 21 Apr 87
  5. ;                             25 Oct 88 now handles 882 frames
  6. ;                             02 Jan 91 removed precision code masks
  7. ; Copyright Apple Computer, Inc. 1984-1988, 1991
  8. ; All Rights Reserved
  9. ;
  10.  
  11. ;  SANE Numerics -- These 881 SANE macros are an enhancement
  12. ;  to the standard SANE macros found in SANEMacs.a; SANE trap
  13. ;  calls are replaced with direct inline MC68881 code.    These
  14. ;  macros are MacII specific, i.e. they take advantage of the
  15. ;  020 and 881.  With the exception of the size of extendeds,
  16. ;  these macros are functionally equivalent to the standard
  17. ;  macros.    By keeping the interface standard but utilizing
  18. ;  96-bit extendeds instead of 80-bits, these macros serve as
  19. ;  a bridge between the old 80-bit software SANE world and
  20. ;  the new 96-bit hardware SANE world.    In addition, these
  21. ;  macros document, for the 020/881 programmer, the access of
  22. ;  SANE routines, such as FRANDX, which aren't found on the
  23. ;  MC68881 and must have their software exceptions mapped to
  24. ;  hardware.
  25.  
  26. ;  YOU MUST RESIZE ALL YOUR 80-BIT EXTENDEDS TO 96-BITS
  27. ;  BEFORE USING THESE MACROS.
  28.  
  29. ;  These 881 SANE macros preserve the 020/881 registers
  30. ;  the same way the standard SANE macros do:  all registers
  31. ;  (except FP0,FP1) are preserved, except that REMAINDER
  32. ;  still returns information in D0 and except that the
  33. ;  scanners and formatter still destroy A0,A1,D0,D1.
  34.  
  35.                   MC68881
  36.                   MACHINE     MC68020
  37.  
  38.     IF &TYPE('__INCLUDINGSANEMACS881__') = 'UNDEFINED' THEN
  39. __INCLUDINGSANEMACS881__    SET    1
  40.  
  41. ;———————————————————————————————————————————————————————————
  42. ; Operation code masks.
  43. ;———————————————————————————————————————————————————————————
  44. FOADD             EQU         $0000                     ; add
  45. FOSUB             EQU         $0002                     ; subtract
  46. FOMUL             EQU         $0004                     ; multiply
  47. FODIV             EQU         $0006                     ; divide
  48. FOCMP             EQU         $0008                     ; compare, no exception from unordered
  49. FOCPX             EQU         $000A                     ; compare, signal invalid if unordered
  50. FOREM             EQU         $000C                     ; remainder
  51. FOZ2X             EQU         $000E                     ; convert to extended
  52. FOX2Z             EQU         $0010                     ; convert from extended
  53. FOSQRT            EQU         $0012                     ; square root
  54. FORTI             EQU         $0014                     ; round to integral value
  55. FOTTI             EQU         $0016                     ; truncate to integral value
  56. FOSCALB           EQU         $0018                     ; binary scale
  57. FOLOGB            EQU         $001A                     ; binary log
  58. FOCLASS           EQU         $001C                     ; classify
  59. ; UNDEFINED     EQU  $001E
  60.  
  61. FOSETENV          EQU         $0001                     ; set environment
  62. FOGETENV          EQU         $0003                     ; get environment
  63. FOSETHV           EQU         $0005                     ; set halt vector
  64. FOGETHV           EQU         $0007                     ; get halt vector
  65. FOD2B             EQU         $0009                     ; convert decimal to binary
  66. FOB2D             EQU         $000B                     ; convert binary to decimal
  67. FONEG             EQU         $000D                     ; negate
  68. FOABS             EQU         $000F                     ; absolute
  69. FOCPYSGN          EQU         $0011                     ; copy sign
  70. FONEXT            EQU         $0013                     ; next-after
  71. FOSETXCP          EQU         $0015                     ; set exception
  72. FOPROCENTRY       EQU         $0017                     ; procedure entry
  73. FOPROCEXIT        EQU         $0019                     ; procedure exit
  74. FOTESTXCP         EQU         $001B                     ; test exception
  75. ; UNDEFINED     EQU  $001D
  76. ; UNDEFINED     EQU  $001F
  77.  
  78.  
  79. ;———————————————————————————————————————————————————————————
  80. ; Operand format masks.
  81. ;———————————————————————————————————————————————————————————
  82. FFEXT             EQU         $0000                     ; extended -- 80-bit float
  83. FFDBL             EQU         $0800                     ; double    -- 64-bit float
  84. FFSGL             EQU         $1000                     ; single    -- 32-bit float
  85. FFINT             EQU         $2000                     ; integer    -- 16-bit integer
  86. FFLNG             EQU         $2800                     ; long int -- 32-bit integer
  87. FFCOMP            EQU         $3000                     ; comp     -- 64-bit integer
  88.  
  89. ;———————————————————————————————————————————————————————————
  90. ; Operations: operand addresses should already be on
  91. ; the stack, with the destination address on top.  The
  92. ; suffix X, D, S, C, I, or L  determines the format of the
  93. ; source operand -- extended, double, single, comp,
  94. ; integer, or long integer, respectively; the destination
  95. ; operand is always extended.
  96. ;———————————————————————————————————————————————————————————
  97.  
  98.  
  99. ;———————————————————————————————————————————————————————————
  100. ; Addition.
  101. ;———————————————————————————————————————————————————————————
  102.                   MACRO
  103.                   FADDX
  104.                   fmove.x     ([4,sp]),fp0
  105.                   fadd.x      ([sp]),fp0
  106.                   fmove.x     fp0,([sp])
  107.                   addq        #8,sp
  108.                   ENDM
  109.  
  110.                   MACRO
  111.                   FADDD
  112.                   fmove.d     ([4,sp]),fp0
  113.                   fadd.x      ([sp]),fp0
  114.                   fmove.x     fp0,([sp])
  115.                   addq        #8,sp
  116.                   ENDM
  117.  
  118.                   MACRO
  119.                   FADDS
  120.                   fmove.s     ([4,sp]),fp0
  121.                   fadd.x      ([sp]),fp0
  122.                   fmove.x     fp0,([sp])
  123.                   addq        #8,sp
  124.                   ENDM
  125.  
  126.                   MACRO
  127.                   FADDC
  128.                   fmove.x     ([sp]),fp1
  129.                   jsr         _FC2X
  130.                   fadd        fp1,fp0
  131.                   fmove.x     fp0,([sp])
  132.                   addq        #8,sp
  133.                   ENDM
  134.  
  135.                   MACRO
  136.                   FADDI
  137.                   fmove.w     ([4,sp]),fp0
  138.                   fadd.x      ([sp]),fp0
  139.                   fmove.x     fp0,([sp])
  140.                   addq        #8,sp
  141.                   ENDM
  142.  
  143.                   MACRO
  144.                   FADDL
  145.                   fmove.l     ([4,sp]),fp0
  146.                   fadd.x      ([sp]),fp0
  147.                   fmove.x     fp0,([sp])
  148.                   addq        #8,sp
  149.                   ENDM
  150.  
  151. ;———————————————————————————————————————————————————————————
  152. ; Subtraction.
  153. ;———————————————————————————————————————————————————————————
  154.                   MACRO
  155.                   FSUBX
  156.                   fmove.x     ([sp]),fp0
  157.                   fsub.x      ([4,sp]),fp0
  158.                   fmove.x     fp0,([sp])
  159.                   addq        #8,sp
  160.                   ENDM
  161.  
  162.                   MACRO
  163.                   FSUBD
  164.                   fmove.x     ([sp]),fp0
  165.                   fsub.d      ([4,sp]),fp0
  166.                   fmove.x     fp0,([sp])
  167.                   addq        #8,sp
  168.                   ENDM
  169.  
  170.                   MACRO
  171.                   FSUBS
  172.                   fmove.x     ([sp]),fp0
  173.                   fsub.s      ([4,sp]),fp0
  174.                   fmove.x     fp0,([sp])
  175.                   addq        #8,sp
  176.                   ENDM
  177.  
  178.                   MACRO
  179.                   FSUBC
  180.                   fmove.x     ([sp]),fp1
  181.                   jsr         _FC2X
  182.                   fsub        fp0,fp1
  183.                   fmove       fp1,fp0
  184.                   fmove.x     fp0,([sp])
  185.                   addq        #8,sp
  186.                   ENDM
  187.  
  188.                   MACRO
  189.                   FSUBI
  190.                   fmove.x     ([sp]),fp0
  191.                   fsub.w      ([4,sp]),fp0
  192.                   fmove.x     fp0,([sp])
  193.                   addq        #8,sp
  194.                   ENDM
  195.  
  196.                   MACRO
  197.                   FSUBL
  198.                   fmove.x     ([sp]),fp0
  199.                   fsub.l      ([4,sp]),fp0
  200.                   fmove.x     fp0,([sp])
  201.                   addq        #8,sp
  202.                   ENDM
  203.  
  204. ;———————————————————————————————————————————————————————————
  205. ; Multiplication.
  206. ;———————————————————————————————————————————————————————————
  207.                   MACRO
  208.                   FMULX
  209.                   fmove.x     ([4,sp]),fp0
  210.                   fmul.x      ([sp]),fp0
  211.                   fmove.x     fp0,([sp])
  212.                   addq        #8,sp
  213.                   ENDM
  214.  
  215.                   MACRO
  216.                   FMULD
  217.                   fmove.d     ([4,sp]),fp0
  218.                   fmul.x      ([sp]),fp0
  219.                   fmove.x     fp0,([sp])
  220.                   addq        #8,sp
  221.                   ENDM
  222.  
  223.                   MACRO
  224.                   FMULS
  225.                   fmove.s     ([4,sp]),fp0
  226.                   fmul.x      ([sp]),fp0
  227.                   fmove.x     fp0,([sp])
  228.                   addq        #8,sp
  229.                   ENDM
  230.  
  231.                   MACRO
  232.                   FMULC
  233.                   fmove.x     ([sp]),fp1
  234.                   jsr         _FC2X
  235.                   fmul        fp1,fp0
  236.                   fmove.x     fp0,([sp])
  237.                   addq        #8,sp
  238.                   ENDM
  239.  
  240.                   MACRO
  241.                   FMULI
  242.                   fmove.w     ([4,sp]),fp0
  243.                   fmul.x      ([sp]),fp0
  244.                   fmove.x     fp0,([sp])
  245.                   addq        #8,sp
  246.                   ENDM
  247.  
  248.                   MACRO
  249.                   FMULL
  250.                   fmove.l     ([4,sp]),fp0
  251.                   fmul.x      ([sp]),fp0
  252.                   fmove.x     fp0,([sp])
  253.                   addq        #8,sp
  254.                   ENDM
  255.  
  256. ;———————————————————————————————————————————————————————————
  257. ; Division.
  258. ;———————————————————————————————————————————————————————————
  259.                   MACRO
  260.                   FDIVX
  261.                   fmove.x     ([sp]),fp0
  262.                   fdiv.x      ([4,sp]),fp0
  263.                   fmove.x     fp0,([sp])
  264.                   addq        #8,sp
  265.                   ENDM
  266.  
  267.                   MACRO
  268.                   FDIVD
  269.                   fmove.x     ([sp]),fp0
  270.                   fdiv.d      ([4,sp]),fp0
  271.                   fmove.x     fp0,([sp])
  272.                   addq        #8,sp
  273.                   ENDM
  274.  
  275.                   MACRO
  276.                   FDIVS
  277.                   fmove.x     ([sp]),fp0
  278.                   fdiv.s      ([4,sp]),fp0
  279.                   fmove.x     fp0,([sp])
  280.                   addq        #8,sp
  281.                   ENDM
  282.  
  283.                   MACRO
  284.                   FDIVC
  285.                   fmove.x     ([sp]),fp1
  286.                   jsr         _FC2X
  287.                   fdiv        fp0,fp1
  288.                   fmove       fp1,fp0
  289.                   fmove.x     fp0,([sp])
  290.                   addq        #8,sp
  291.                   ENDM
  292.  
  293.                   MACRO
  294.                   FDIVI
  295.                   fmove.x     ([sp]),fp0
  296.                   fdiv.w      ([4,sp]),fp0
  297.                   fmove.x     fp0,([sp])
  298.                   addq        #8,sp
  299.                   ENDM
  300.  
  301.                   MACRO
  302.                   FDIVL
  303.                   fmove.x     ([sp]),fp0
  304.                   fdiv.l      ([4,sp]),fp0
  305.                   fmove.x     fp0,([sp])
  306.                   addq        #8,sp
  307.                   ENDM
  308.  
  309. ;———————————————————————————————————————————————————————————
  310. ; Square root.
  311. ;———————————————————————————————————————————————————————————
  312.                   MACRO
  313.                   FSQRTX
  314.                   fsqrt.x     ([sp]),fp0
  315.                   fmove.x     fp0,([sp])
  316.                   addq        #4,sp
  317.                   ENDM
  318.  
  319. ;———————————————————————————————————————————————————————————
  320. ; Round to integer, according to the current rounding mode.
  321. ;———————————————————————————————————————————————————————————
  322.                   MACRO
  323.                   FRINTX
  324.                   fint.x      ([sp]),fp0
  325.                   fmove.x     fp0,([sp])
  326.                   addq        #4,sp
  327.                   ENDM
  328.  
  329. ;———————————————————————————————————————————————————————————
  330. ; Truncate to integer, using round toward zero.
  331. ;———————————————————————————————————————————————————————————
  332.                   MACRO
  333.                   FTINTX
  334.                   fintrz.x    ([sp]),fp0
  335.                   fmove.x     fp0,([sp])
  336.                   addq        #4,sp
  337.                   ENDM
  338.  
  339. ;———————————————————————————————————————————————————————————
  340. ; Remainder.        COMPATIBILITY: QUOT is moved to D0
  341. ;———————————————————————————————————————————————————————————
  342.                   MACRO
  343.                   FREMX
  344.                   fmove.x     ([sp]),fp0
  345.                   frem.x      ([4,sp]),fp0
  346.                   fmove.x     fp0,([sp])
  347.                   fmove       fpsr,d0
  348.                   bfextu      d0{8:8},d0
  349.                   bpl.s       @1
  350.                   bclr        #7,d0
  351.                   neg.l       d0
  352. @1                addq        #8,sp
  353.                   ENDM
  354.  
  355.                   MACRO
  356.                   FREMD
  357.                   fmove.x     ([sp]),fp0
  358.                   frem.d      ([4,sp]),fp0
  359.                   fmove.x     fp0,([sp])
  360.                   fmove       fpsr,d0
  361.                   bfextu      d0{8:8},d0
  362.                   bpl.s       @1
  363.                   bclr        #7,d0
  364.                   neg.l       d0
  365. @1                addq        #8,sp
  366.                   ENDM
  367.  
  368.                   MACRO
  369.                   FREMS
  370.                   fmove.x     ([sp]),fp0
  371.                   frem.s      ([4,sp]),fp0
  372.                   fmove.x     fp0,([sp])
  373.                   fmove       fpsr,d0
  374.                   bfextu      d0{8:8},d0
  375.                   bpl.s       @1
  376.                   bclr        #7,d0
  377.                   neg.l       d0
  378. @1                addq        #8,sp
  379.                   ENDM
  380.  
  381.                   MACRO
  382.                   FREMC
  383.                   fmove.x     ([sp]),fp1
  384.                   jsr         _FC2X
  385.                   frem        fp0,fp1
  386.                   fmove       fp1,fp0
  387.                   fmove.x     fp0,([sp])
  388.                   fmove       fpsr,d0
  389.                   bfextu      d0{8:8},d0
  390.                   bpl.s       @1
  391.                   bclr        #7,d0
  392.                   neg.l       d0
  393. @1                addq        #8,sp
  394.                   ENDM
  395.  
  396.                   MACRO
  397.                   FREMI
  398.                   fmove.x     ([sp]),fp0
  399.                   frem.w      ([4,sp]),fp0
  400.                   fmove.x     fp0,([sp])
  401.                   fmove       fpsr,d0
  402.                   bfextu      d0{8:8},d0
  403.                   bpl.s       @1
  404.                   bclr        #7,d0
  405.                   neg.l       d0
  406. @1                addq        #8,sp
  407.                   ENDM
  408.  
  409.                   MACRO
  410.                   FREML
  411.                   fmove.x     ([sp]),fp0
  412.                   frem.l      ([4,sp]),fp0
  413.                   fmove.x     fp0,([sp])
  414.                   fmove       fpsr,d0
  415.                   bfextu      d0{8:8},d0
  416.                   bpl.s       @1
  417.                   bclr        #7,d0
  418.                   neg.l       d0
  419. @1                addq        #8,sp
  420.                   ENDM
  421.  
  422. ;———————————————————————————————————————————————————————————
  423. ; Logb.
  424. ;———————————————————————————————————————————————————————————
  425.                   MACRO
  426.                   FLOGBX
  427.                   fmove.x     ([sp]),fp0
  428.                   fbne.w      @1
  429.                   flog2       fp0
  430.                   bra.s       @3
  431. @1                fmove       fpsr,-(sp)
  432.                   andi.l      #$02000000,(sp)+
  433.                   beq.s       @2
  434.                   fabs        fp0
  435.                   bra.s       @3
  436. @2                fgetexp     fp0,fp0
  437. @3                fmove.x     fp0,([sp])
  438.                   addq        #4,sp
  439.                   ENDM
  440.  
  441. ;———————————————————————————————————————————————————————————
  442. ; Scalb.
  443. ;———————————————————————————————————————————————————————————
  444.                   MACRO
  445.                   FSCALBX
  446.                   jsr         _fprocENTRYsp
  447.                   move.w      ([sp]),([sp],2)
  448.                   addq.l      #2,(sp)
  449.                   MOVE.W      #FFINT+FOSCALB,-(SP)
  450.                   _FP68K
  451.                   fmove.x     fp0,([12,sp])
  452.                   jsr         _fprocEXITsp
  453.                   ENDM
  454.  
  455. ;———————————————————————————————————————————————————————————
  456. ; Copy-sign.
  457. ;———————————————————————————————————————————————————————————
  458.                   MACRO
  459.                   FCPYSGNX
  460.                   bclr        #7,([4,sp])
  461.                   tst.b       ([sp])
  462.                   bpl.s       @1
  463.                   bset        #7,([sp])
  464. @1                addq.l      #8,sp
  465.                   ENDM
  466.  
  467. ;———————————————————————————————————————————————————————————
  468. ; Negate.
  469. ;———————————————————————————————————————————————————————————
  470.                   MACRO
  471.                   FNEGX
  472.                   bchg.b      #7,([sp])
  473.                   addq.l      #4,sp
  474.                   ENDM
  475.  
  476. ;———————————————————————————————————————————————————————————
  477. ; Absolute value.
  478. ;———————————————————————————————————————————————————————————
  479.                   MACRO
  480.                   FABSX
  481.                   bclr.b      #7,([sp])
  482.                   addq.l      #4,sp
  483.                   ENDM
  484.  
  485. ;———————————————————————————————————————————————————————————
  486. ; Next-after.  NOTE: both operands are of the same
  487. ; format, as specified by the usual suffix.
  488. ;———————————————————————————————————————————————————————————
  489.                   MACRO
  490.                   FNEXTS
  491.                   jsr         _fprocENTRYsp
  492.                   MOVE.W      #FFSGL+FONEXT,-(SP)
  493.                   _FP68K
  494.                   jsr         _fprocEXITsp
  495.                   ENDM
  496.  
  497.                   MACRO
  498.                   FNEXTD
  499.                   jsr         _fprocENTRYsp
  500.                   MOVE.W      #FFDBL+FONEXT,-(SP)
  501.                   _FP68K
  502.                   jsr         _fprocEXITsp
  503.                   ENDM
  504.  
  505.                   MACRO
  506.                   FNEXTX
  507.                   jsr         _fprocENTRYsp
  508.                   move.w      ([sp]),([sp],2)
  509.                   addq.l      #2,(sp)
  510.                   move.w      ([4,sp]),([4,sp],2)
  511.                   addq.l      #2,4(sp)
  512.                   MOVE.W      #FFEXT+FONEXT,-(SP)
  513.                   _FP68K
  514.                   fmove.x     fp0,([16,sp])
  515.                   jsr         _fprocEXITsp
  516.                   ENDM
  517.  
  518. ;———————————————————————————————————————————————————————————
  519. ; Conversion to extended.
  520. ;———————————————————————————————————————————————————————————
  521.                   MACRO
  522.                   FX2X
  523.                   fmove.x     ([4,sp]),fp0
  524.                   fmove.x     fp0,([sp])
  525.                   addq.l      #8,sp
  526.                   ENDM
  527.  
  528.                   MACRO
  529.                   FD2X
  530.                   fmove.d     ([4,sp]),fp0
  531.                   fmove.x     fp0,([sp])
  532.                   addq.l      #8,sp
  533.                   ENDM
  534.  
  535.                   MACRO
  536.                   FS2X
  537.                   fmove.s     ([4,sp]),fp0
  538.                   fmove.x     fp0,([sp])
  539.                   addq.l      #8,sp
  540.                   ENDM
  541.  
  542.                   MACRO
  543.                   FI2X
  544.                   fmove.w     ([4,sp]),fp0
  545.                   fmove.x     fp0,([sp])
  546.                   addq.l      #8,sp
  547.                   ENDM
  548.  
  549.                   MACRO
  550.                   FL2X
  551.                   fmove.l     ([4,sp]),fp0
  552.                   fmove.x     fp0,([sp])
  553.                   addq.l      #8,sp
  554.                   ENDM
  555.  
  556.                   MACRO
  557.                   FC2X
  558.                   jsr         _FC2X
  559.                   addq        #8,sp
  560.                   ENDM
  561.  
  562. ;———————————————————————————————————————————————————————————
  563. ; Conversion from extended.
  564. ;———————————————————————————————————————————————————————————
  565.                   MACRO
  566.                   FX2D
  567.                   fmove.x     ([4,sp]),fp0
  568.                   fmove.d     fp0,([sp])
  569.                   addq.l      #8,sp
  570.                   ENDM
  571.  
  572.                   MACRO
  573.                   FX2S
  574.                   fmove.x     ([4,sp]),fp0
  575.                   fmove.s     fp0,([sp])
  576.                   addq.l      #8,sp
  577.                   ENDM
  578.  
  579.                   MACRO
  580.                   FX2I
  581.                   fmove.x     ([4,sp]),fp0
  582.                   fmove.w     fp0,([sp])
  583.                   addq.l      #8,sp
  584.                   ENDM
  585.  
  586.                   MACRO
  587.                   FX2L
  588.                   fmove.x     ([4,sp]),fp0
  589.                   fmove.l     fp0,([sp])
  590.                   addq.l      #8,sp
  591.                   ENDM
  592.  
  593.                   MACRO
  594.                   FX2C
  595.                   jsr         _fprocENTRYsp
  596.                   move.w      ([4,sp]),([4,sp],2)
  597.                   addq.l      #2,4(sp)
  598.                   MOVE.W      #FFCOMP+FOX2Z,-(SP)
  599.                   _FP68K
  600.                   jsr         _fprocEXITsp
  601.                   ENDM
  602.  
  603. ;———————————————————————————————————————————————————————————
  604. ; Binary to decimal conversion.
  605. ;———————————————————————————————————————————————————————————
  606.                   MACRO
  607.                   FX2DEC
  608.                   jsr         _fprocENTRYsp
  609.                   move.l      12(sp),16(sp)
  610.                   move.l      8(sp),12(sp)
  611.                   move.l      28(sp),8(sp)
  612.                   move.w      ([4,sp]),([4,sp],2)
  613.                   addq.l      #2,4(sp)
  614.                   MOVE.W      #FFEXT+FOB2D,-(SP)
  615.                   _FP68K
  616.                   jsr         _fprocEXITsp
  617.                   ENDM
  618.  
  619.                   MACRO
  620.                   FD2DEC
  621.                   jsr         _fprocENTRYsp
  622.                   move.l      12(sp),16(sp)
  623.                   move.l      8(sp),12(sp)
  624.                   move.l      28(sp),8(sp)
  625.                   MOVE.W      #FFDBL+FOB2D,-(SP)
  626.                   _FP68K
  627.                   jsr         _fprocEXITsp
  628.                   ENDM
  629.  
  630.                   MACRO
  631.                   FS2DEC
  632.                   jsr         _fprocENTRYsp
  633.                   move.l      12(sp),16(sp)
  634.                   move.l      8(sp),12(sp)
  635.                   move.l      28(sp),8(sp)
  636.                   MOVE.W      #FFSGL+FOB2D,-(SP)
  637.                   _FP68K
  638.                   jsr         _fprocEXITsp
  639.                   ENDM
  640.  
  641.                   MACRO
  642.                   FC2DEC
  643.                   jsr         _fprocENTRYsp
  644.                   move.l      12(sp),16(sp)
  645.                   move.l      8(sp),12(sp)
  646.                   move.l      28(sp),8(sp)
  647.                   MOVE.W      #FFCOMP+FOB2D,-(SP)
  648.                   _FP68K
  649.                   jsr         _fprocEXITsp
  650.                   ENDM
  651.  
  652.                   MACRO
  653.                   FI2DEC
  654.                   jsr         _fprocENTRYsp
  655.                   move.l      12(sp),16(sp)
  656.                   move.l      8(sp),12(sp)
  657.                   move.l      28(sp),8(sp)
  658.                   MOVE.W      #FFINT+FOB2D,-(SP)
  659.                   _FP68K
  660.                   jsr         _fprocEXITsp
  661.                   ENDM
  662.  
  663.                   MACRO
  664.                   FL2DEC
  665.                   jsr         _fprocENTRYsp
  666.                   move.l      12(sp),16(sp)
  667.                   move.l      8(sp),12(sp)
  668.                   move.l      28(sp),8(sp)
  669.                   MOVE.W      #FFLNG+FOB2D,-(SP)
  670.                   _FP68K
  671.                   jsr         _fprocEXITsp
  672.                   ENDM
  673.  
  674. ;———————————————————————————————————————————————————————————
  675. ; Decimal to binary conversion.
  676. ;———————————————————————————————————————————————————————————
  677.                   MACRO
  678.                   FDEC2X
  679.                   jsr         _fprocENTRYsp
  680.                   addq.l      #2,(sp)
  681.                   MOVE.W      #FFEXT+FOD2B,-(SP)
  682.                   _FP68K
  683.                   move.w      ([12,sp],2),([12,sp])
  684.                   jsr         _fprocEXITsp
  685.                   ENDM
  686.  
  687.                   MACRO
  688.                   FDEC2D
  689.                   jsr         _fprocENTRYsp
  690.                   MOVE.W      #FFDBL+FOD2B,-(SP)
  691.                   _FP68K
  692.                   jsr         _fprocEXITsp
  693.                   ENDM
  694.  
  695.                   MACRO
  696.                   FDEC2S
  697.                   jsr         _fprocENTRYsp
  698.                   MOVE.W      #FFSGL+FOD2B,-(SP)
  699.                   _FP68K
  700.                   jsr         _fprocEXITsp
  701.                   ENDM
  702.  
  703.                   MACRO
  704.                   FDEC2C
  705.                   jsr         _fprocENTRYsp
  706.                   MOVE.W      #FFCOMP+FOD2B,-(SP)
  707.                   _FP68K
  708.                   jsr         _fprocEXITsp
  709.                   ENDM
  710.  
  711.                   MACRO
  712.                   FDEC2I
  713.                   jsr         _fprocENTRYsp
  714.                   MOVE.W      #FFINT+FOD2B,-(SP)
  715.                   _FP68K
  716.                   jsr         _fprocEXITsp
  717.                   ENDM
  718.  
  719.                   MACRO
  720.                   FDEC2L
  721.                   jsr         _fprocENTRYsp
  722.                   MOVE.W      #FFLNG+FOD2B,-(SP)
  723.                   _FP68K
  724.                   jsr         _fprocEXITsp
  725.                   ENDM
  726.  
  727. ;———————————————————————————————————————————————————————————
  728. ; Compare, not signaling invalid on unordered.    INCOMPATIBILITY: doesn't set 020's CCR
  729. ;———————————————————————————————————————————————————————————
  730.                   MACRO
  731.                   FCMPX
  732.                   fmove.x     ([sp]),fp0
  733.                   fcmp.x      ([4,sp]),fp0
  734.                   addq.l      #8,sp
  735.                   ENDM
  736.  
  737.                   MACRO
  738.                   FCMPD
  739.                   fmove.x     ([sp]),fp0
  740.                   fcmp.d      ([4,sp]),fp0
  741.                   addq.l      #8,sp
  742.                   ENDM
  743.  
  744.                   MACRO
  745.                   FCMPS
  746.                   fmove.x     ([sp]),fp0
  747.                   fcmp.s      ([4,sp]),fp0
  748.                   addq.l      #8,sp
  749.                   ENDM
  750.  
  751.                   MACRO
  752.                   FCMPC
  753.                   fmovem.x    ([sp]),fp1
  754.                   jsr         _FC2X
  755.                   fcmp.x      fp0,fp1
  756.                   fmovem.x    fp1,([sp])
  757.                   addq.l      #8,sp
  758.                   ENDM
  759.  
  760.                   MACRO
  761.                   FCMPI
  762.                   fmove.x     ([sp]),fp0
  763.                   fcmp.w      ([4,sp]),fp0
  764.                   addq.l      #8,sp
  765.                   ENDM
  766.  
  767.                   MACRO
  768.                   FCMPL
  769.                   fmove.x     ([sp]),fp0
  770.                   fcmp.l      ([4,sp]),fp0
  771.                   addq.l      #8,sp
  772.                   ENDM
  773.  
  774. ;———————————————————————————————————————————————————————————
  775. ; Compare, signaling invalid on unordered.    INCOMPATIBILITY: doesn't set 020's CCR
  776. ;———————————————————————————————————————————————————————————
  777.                   MACRO
  778.                   FCPXX
  779.                   fmove.x     ([sp]),fp0
  780.                   fcmp.x      ([4,sp]),fp0
  781.                   addq.l      #8,sp
  782.                   fbsf.w      *+2
  783.                   ENDM
  784.  
  785.                   MACRO
  786.                   FCPXD
  787.                   fmove.x     ([sp]),fp0
  788.                   fcmp.d      ([4,sp]),fp0
  789.                   addq.l      #8,sp
  790.                   fbsf.w      *+2
  791.                   ENDM
  792.  
  793.                   MACRO
  794.                   FCPXS
  795.                   fmove.x     ([sp]),fp0
  796.                   fcmp.s      ([4,sp]),fp0
  797.                   addq.l      #8,sp
  798.                   fbsf.w      *+2
  799.                   ENDM
  800.  
  801.                   MACRO
  802.                   FCPXC
  803.                   fmove.x     ([sp]),fp1
  804.                   jsr         _FC2X
  805.                   fcmp.x      fp0,fp1
  806.                   fmovem.x    fp1,([sp])
  807.                   addq.l      #8,sp
  808.                   fbsf.w      *+2
  809.                   ENDM
  810.  
  811.                   MACRO
  812.                   FCPXI
  813.                   fmove.x     ([sp]),fp0
  814.                   fcmp.w      ([4,sp]),fp0
  815.                   addq.l      #8,sp
  816.                   fbsf.w      *+2
  817.                   ENDM
  818.  
  819.                   MACRO
  820.                   FCPXL
  821.                   fmove.x     ([sp]),fp0
  822.                   fcmp.l      ([4,sp]),fp0
  823.                   addq.l      #8,sp
  824.                   fbsf.w      *+2
  825.                   ENDM
  826.  
  827. ;———————————————————————————————————————————————————————————
  828. ; The following defines a set of so-called floating
  829. ; branches.  They presume that the appropriate compare
  830. ; operation, FCMPz or FCPXz, precedes.
  831. ;———————————————————————————————————————————————————————————
  832.                   MACRO
  833.                   FBEQL
  834.                   FBEQ.L      &SYSLIST[1]
  835.                   ENDM
  836.  
  837.                   MACRO
  838.                   FBLTL
  839.                   FBOLT.L     &SYSLIST[1]
  840.                   ENDM
  841.  
  842.                   MACRO
  843.                   FBLEL
  844.                   FBOLE.L     &SYSLIST[1]
  845.                   ENDM
  846.  
  847.                   MACRO
  848.                   FBGTL
  849.                   FBOGT.L     &SYSLIST[1]
  850.                   ENDM
  851.  
  852.                   MACRO
  853.                   FBGEL
  854.                   FBOGE.L     &SYSLIST[1]
  855.                   ENDM
  856.  
  857.                   MACRO
  858.                   FBULTL
  859.                   FBULT.L     &SYSLIST[1]
  860.                   ENDM
  861.  
  862.                   MACRO
  863.                   FBULEL
  864.                   FBULE.L     &SYSLIST[1]
  865.                   ENDM
  866.  
  867.                   MACRO
  868.                   FBUGTL
  869.                   FBUGT.L     &SYSLIST[1]
  870.                   ENDM
  871.  
  872.                   MACRO
  873.                   FBUGEL
  874.                   FBUGE.L     &SYSLIST[1]
  875.                   ENDM
  876.  
  877.                   MACRO
  878.                   FBUL
  879.                   FBUN.L      &SYSLIST[1]
  880.                   ENDM
  881.  
  882.                   MACRO
  883.                   FBOL
  884.                   FBOR.L      &SYSLIST[1]
  885.                   ENDM
  886.  
  887.                   MACRO
  888.                   FBNEL
  889.                   FBNE.L      &SYSLIST[1]
  890.                   ENDM
  891.  
  892.                   MACRO
  893.                   FBUEL
  894.                   FBUEQ.L     &SYSLIST[1]
  895.                   ENDM
  896.  
  897.                   MACRO
  898.                   FBLGL
  899.                   FBOGL.L     &SYSLIST[1]
  900.                   ENDM
  901.  
  902. ;———————————————————————————————————————————————————————————
  903. ; Short branch versions.
  904. ;———————————————————————————————————————————————————————————
  905.                   MACRO
  906.                   FBEQS
  907.                   FBEQ.W      &SYSLIST[1]
  908.                   ENDM
  909.  
  910.                   MACRO
  911.                   FBLTS
  912.                   FBOLT.W     &SYSLIST[1]
  913.                   ENDM
  914.  
  915.                   MACRO
  916.                   FBLES
  917.                   FBOLE.W     &SYSLIST[1]
  918.                   ENDM
  919.  
  920.                   MACRO
  921.                   FBGTS
  922.                   FBOGT.W     &SYSLIST[1]
  923.                   ENDM
  924.  
  925.                   MACRO
  926.                   FBGES
  927.                   FBOGE.W     &SYSLIST[1]
  928.                   ENDM
  929.  
  930.                   MACRO
  931.                   FBULTS
  932.                   FBULT.W     &SYSLIST[1]
  933.                   ENDM
  934.  
  935.                   MACRO
  936.                   FBULES
  937.                   FBULE.W     &SYSLIST[1]
  938.                   ENDM
  939.  
  940.                   MACRO
  941.                   FBUGTS
  942.                   FBUGT.W     &SYSLIST[1]
  943.                   ENDM
  944.  
  945.                   MACRO
  946.                   FBUGES
  947.                   FBUGE.W     &SYSLIST[1]
  948.                   ENDM
  949.  
  950.                   MACRO
  951.                   FBUS
  952.                   FBUN.W      &SYSLIST[1]
  953.                   ENDM
  954.  
  955.                   MACRO
  956.                   FBOS
  957.                   FBOR.W      &SYSLIST[1]
  958.                   ENDM
  959.  
  960.                   MACRO
  961.                   FBNES
  962.                   FBNE.W      &SYSLIST[1]
  963.                   ENDM
  964.  
  965.                   MACRO
  966.                   FBUES
  967.                   FBUEQ.W     &SYSLIST[1]
  968.                   ENDM
  969.  
  970.                   MACRO
  971.                   FBLGS
  972.                   FBOGL.W     &SYSLIST[1]
  973.                   ENDM
  974.  
  975. ;———————————————————————————————————————————————————————————
  976. ; Class and sign inquiries.
  977. ;———————————————————————————————————————————————————————————
  978. FCSNAN            EQU         1                         ; signaling NAN
  979. FCQNAN            EQU         2                         ; quiet NAN
  980. FCINF             EQU         3                         ; infinity
  981. FCZERO            EQU         4                         ; zero
  982. FCNORM            EQU         5                         ; normal number
  983. FCDENORM          EQU         6                         ; denormal number
  984.  
  985.                   MACRO
  986.                   FCLASSS
  987.                   MOVE.W      #FFSGL+FOCLASS,-(SP)
  988.                   _FP68K
  989.                   ENDM
  990.  
  991.                   MACRO
  992.                   FCLASSD
  993.                   MOVE.W      #FFDBL+FOCLASS,-(SP)
  994.                   _FP68K
  995.                   ENDM
  996.  
  997.                   MACRO
  998.                   FCLASSX
  999.                   MOVE.W      ([4,SP]),([4,SP],2)
  1000.                   ADDQ.L      #2,4(SP)
  1001.                   MOVE.W      #FFEXT+FOCLASS,-(SP)
  1002.                   _FP68K
  1003.                   ENDM
  1004.  
  1005.                   MACRO
  1006.                   FCLASSC
  1007.                   MOVE.W      #FFCOMP+FOCLASS,-(SP)
  1008.                   _FP68K
  1009.                   ENDM
  1010.  
  1011. ;———————————————————————————————————————————————————————————
  1012. ; Bit indexes for bytes of floating point environment word.
  1013. ;———————————————————————————————————————————————————————————
  1014. FBINVALID         EQU         0                         ; invalid operation
  1015. FBUFLOW           EQU         1                         ; underflow
  1016. FBOFLOW           EQU         2                         ; overflow
  1017. FBDIVZER          EQU         3                         ; division by zero
  1018. FBINEXACT         EQU         4                         ; inexact
  1019. FBRNDLO           EQU         5                         ; low bit of rounding mode
  1020. FBRNDHI           EQU         6                         ; high bit of rounding mode
  1021. FBLSTRND          EQU         7                         ; last round result bit
  1022. FBDBL             EQU         5                         ; double precision control
  1023. FBSGL             EQU         6                         ; single precision control
  1024.  
  1025. ;———————————————————————————————————————————————————————————
  1026. ; Get and set environment.
  1027. ;———————————————————————————————————————————————————————————
  1028.                   MACRO
  1029.                   FGETENV
  1030.                   MOVE.W      #FOGETENV,-(SP)
  1031.                   _FP68K
  1032.                   ENDM
  1033.  
  1034.                   MACRO
  1035.                   FSETENV
  1036.                   MOVE.W      #FOSETENV,-(SP)
  1037.                   _FP68K
  1038.                   ENDM
  1039.  
  1040. ;———————————————————————————————————————————————————————————
  1041. ; Test and set exception.
  1042. ;———————————————————————————————————————————————————————————
  1043.                   MACRO
  1044.                   FTESTXCP
  1045.                   MOVE.W      #FOTESTXCP,-(SP)
  1046.                   _FP68K
  1047.                   ENDM
  1048.  
  1049.                   MACRO
  1050.                   FSETXCP
  1051.                   move.l      (sp),-(sp)
  1052.                   jsr         _fprocENTRYsp
  1053.                   MOVE.W      #FOSETXCP,-(SP)
  1054.                   _FP68K
  1055.                   clr.l       (sp)+
  1056.                   jsr         _fprocEXITsp
  1057.                   ENDM
  1058.  
  1059. ;———————————————————————————————————————————————————————————
  1060. ; Procedure entry and exit.
  1061. ;———————————————————————————————————————————————————————————
  1062.                   MACRO
  1063.                   FPROCENTRY
  1064.                   MOVE.W      #FOPROCENTRY,-(SP)
  1065.                   _FP68K
  1066.                   ENDM
  1067.  
  1068.                   MACRO
  1069.                   FPROCEXIT
  1070.                   move.l      (sp),-(sp)
  1071.                   jsr         _fprocENTRYsp
  1072.                   MOVE.W      #FOPROCEXIT,-(SP)
  1073.                   _FP68K
  1074.                   clr.l       (sp)+
  1075.                   jsr         _fprocEXITsp
  1076.                   ENDM
  1077.  
  1078. ;———————————————————————————————————————————————————————————
  1079. ; Get and set halt vector.
  1080. ;———————————————————————————————————————————————————————————
  1081.                   MACRO
  1082.                   FGETHV
  1083.                   MOVE.W      #FOGETHV,-(SP)
  1084.                   _FP68K
  1085.                   ENDM
  1086.  
  1087.                   MACRO
  1088.                   FSETHV
  1089.                   move.l      ([sp]),$0c0
  1090.                   move.l      ([sp]),$0c4
  1091.                   move.l      ([sp]),$0c8
  1092.                   move.l      ([sp]),$0cc
  1093.                   move.l      ([sp]),$0d0
  1094.                   move.l      ([sp]),$0d4
  1095.                   move.l      ([sp]),$0d8
  1096.                   MOVE.W      #FOSETHV,-(SP)
  1097.                   _FP68K
  1098.                   ENDM
  1099.  
  1100.  
  1101.  
  1102. ;———————————————————————————————————————————————————————————
  1103. ; Elementary function operation code masks.
  1104. ;———————————————————————————————————————————————————————————
  1105. FOLNX             EQU         $0000                     ; base-e log
  1106. FOLOG2X           EQU         $0002                     ; base-2 log
  1107. FOLN1X            EQU         $0004                     ; ln (1 + x)
  1108. FOLOG21X          EQU         $0006                     ; log2 (1 + x)
  1109.  
  1110. FOEXPX            EQU         $0008                     ; base-e exponential
  1111. FOEXP2X           EQU         $000A                     ; base-2 exponential
  1112. FOEXP1X           EQU         $000C                     ; exp (x) - 1
  1113. FOEXP21X          EQU         $000E                     ; exp2 (x) - 1
  1114.  
  1115. FOXPWRI           EQU         $8010                     ; integer exponentiation
  1116. FOXPWRY           EQU         $8012                     ; general exponentiation
  1117. FOCOMPOUND        EQU         $C014                     ; compound
  1118. FOANNUITY         EQU         $C016                     ; annuity
  1119.  
  1120. FOSINX            EQU         $0018                     ; sine
  1121. FOCOSX            EQU         $001A                     ; cosine
  1122. FOTANX            EQU         $001C                     ; tangent
  1123. FOATANX           EQU         $001E                     ; arctangent
  1124. FORANDX           EQU         $0020                     ; random
  1125.  
  1126. ;———————————————————————————————————————————————————————————
  1127. ; Elementary functions.
  1128. ;———————————————————————————————————————————————————————————
  1129.                   MACRO
  1130.                   FLNX                                  ; base-e log
  1131.                   flogn.x     ([sp]),fp0
  1132.                   fmove.x     fp0,([sp])
  1133.                   addq.l      #4,sp
  1134.                   ENDM
  1135.  
  1136.                   MACRO
  1137.                   FLOG2X                                ; base-2 log
  1138.                   flog2.x     ([sp]),fp0
  1139.                   fmove.x     fp0,([sp])
  1140.                   addq.l      #4,sp
  1141.                   ENDM
  1142.  
  1143.                   MACRO
  1144.                   FLN1X                                 ; ln (1 + x)
  1145.                   flognp1.x   ([sp]),fp0
  1146.                   fmove.x     fp0,([sp])
  1147.                   addq.l      #4,sp
  1148.                   ENDM
  1149.  
  1150.                   MACRO
  1151.                   FLOG21X                               ; log2 (1 + x)
  1152.                   move.l      (sp),-(sp)
  1153.                   jsr         _fprocENTRYsp
  1154.                   move.w      ([sp]),([sp],2)
  1155.                   addq.l      #2,(sp)
  1156.                   MOVE.W      #FOLOG21X,-(SP)
  1157.                   _ELEMS68K
  1158.                   move.w      ([sp],2),([sp])
  1159.                   clr.l       (sp)+
  1160.                   jsr         _fprocEXITsp
  1161.                   ENDM
  1162.  
  1163.                   MACRO
  1164.                   FEXPX                                 ; base-e exponential
  1165.                   fetox.x     ([sp]),fp0
  1166.                   fmove.x     fp0,([sp])
  1167.                   addq.l      #4,sp
  1168.                   ENDM
  1169.  
  1170.                   MACRO
  1171.                   FEXP2X                                ; base-2 exponential
  1172.                   ftwotox.x   ([sp]),fp0
  1173.                   fmove.x     fp0,([sp])
  1174.                   addq.l      #4,sp
  1175.                   ENDM
  1176.  
  1177.                   MACRO
  1178.                   FEXP1X                                ; exp (x) - 1
  1179.                   fetoxm1.x   ([sp]),fp0
  1180.                   fmove.x     fp0,([sp])
  1181.                   addq.l      #4,sp
  1182.                   ENDM
  1183.  
  1184.                   MACRO
  1185.                   FEXP21X                               ; exp2 (x) - 1
  1186.                   move.l      (sp),-(sp)
  1187.                   jsr         _fprocENTRYsp
  1188.                   move.w      ([sp]),([sp],2)
  1189.                   addq.l      #2,(sp)
  1190.                   MOVE.W      #FOEXP21X,-(SP)
  1191.                   _ELEMS68K
  1192.                   move.w      ([sp],2),([sp])
  1193.                   clr.l       (sp)+
  1194.                   jsr         _fprocEXITsp
  1195.                   ENDM
  1196.  
  1197.                   MACRO
  1198.                   FXPWRI                                ; integer exponential
  1199.                   jsr         _fprocENTRYsp
  1200.                   move.w      ([sp]),([sp],2)
  1201.                   addq.l      #2,(sp)
  1202.                   MOVE.W      #FOXPWRI,-(SP)
  1203.                   _ELEMS68K
  1204.                   move.w      ([12,sp],2),([12,sp])
  1205.                   jsr         _fprocEXITsp
  1206.                   ENDM
  1207.  
  1208.                   MACRO
  1209.                   FXPWRY                                ; general exponential
  1210.                   jsr         _fprocENTRYsp
  1211.                   move.w      ([4,sp]),([4,sp],2)
  1212.                   addq.l      #2,4(sp)
  1213.                   move.w      ([sp]),([sp],2)
  1214.                   addq.l      #2,(sp)
  1215.                   MOVE.W      #FOXPWRY,-(SP)
  1216.                   _ELEMS68K
  1217.                   move.w      ([12,sp],2),([12,sp])
  1218.                   jsr         _fprocEXITsp
  1219.                   ENDM
  1220.  
  1221.                   MACRO
  1222.                   FCOMPOUND                             ; compound
  1223.                   jsr         _fprocENTRYsp
  1224.                   move.l      12(sp),16(sp)
  1225.                   move.l      8(sp),12(sp)
  1226.                   move.l      28(sp),8(sp)
  1227.                   move.w      ([sp]),([sp],2)
  1228.                   addq.l      #2,(sp)
  1229.                   move.w      ([4,sp]),([4,sp],2)
  1230.                   addq.l      #2,4(sp)
  1231.                   move.w      ([8,sp]),([8,sp],2)
  1232.                   addq.l      #2,8(sp)
  1233.                   MOVE.W      #FOCOMPOUND,-(SP)
  1234.                   _ELEMS68K
  1235.                   move.w      ([8,sp],2),([8,sp])
  1236.                   jsr         _fprocEXITsp
  1237.                   ENDM
  1238.  
  1239.                   MACRO
  1240.                   FANNUITY                              ; annuity
  1241.                   jsr         _fprocENTRYsp
  1242.                   move.l      12(sp),16(sp)
  1243.                   move.l      8(sp),12(sp)
  1244.                   move.l      28(sp),8(sp)
  1245.                   move.w      ([sp]),([sp],2)
  1246.                   addq.l      #2,(sp)
  1247.                   move.w      ([4,sp]),([4,sp],2)
  1248.                   addq.l      #2,4(sp)
  1249.                   move.w      ([8,sp]),([8,sp],2)
  1250.                   addq.l      #2,8(sp)
  1251.                   MOVE.W      #FOANNUITY,-(SP)
  1252.                   _ELEMS68K
  1253.                   move.w      ([8,sp],2),([8,sp])
  1254.                   jsr         _fprocEXITsp
  1255.                   ENDM
  1256.  
  1257.                   MACRO
  1258.                   FSINX                                 ; sine
  1259.                   fsin.x      ([sp]),fp0
  1260.                   fmove.x     fp0,([sp])
  1261.                   addq.l      #4,sp
  1262.                   ENDM
  1263.  
  1264.                   MACRO
  1265.                   FCOSX                                 ; cosine
  1266.                   fcos.x      ([sp]),fp0
  1267.                   fmove.x     fp0,([sp])
  1268.                   addq.l      #4,sp
  1269.                   ENDM
  1270.  
  1271.                   MACRO
  1272.                   FTANX                                 ; tangent
  1273.                   ftan.x      ([sp]),fp0
  1274.                   fmove.x     fp0,([sp])
  1275.                   addq.l      #4,sp
  1276.                   ENDM
  1277.  
  1278.                   MACRO
  1279.                   FATANX                                ; arctangent
  1280.                   fatan.x     ([sp]),fp0
  1281.                   fmove.x     fp0,([sp])
  1282.                   addq.l      #4,sp
  1283.                   ENDM
  1284.  
  1285.                   MACRO
  1286.                   FRANDX                                ; random number generator
  1287.                   move.l      (sp),-(sp)
  1288.                   jsr         _fprocENTRYsp
  1289.                   move.w      ([sp]),([sp],2)
  1290.                   addq.l      #2,(sp)
  1291.                   MOVE.W      #FORANDX,-(SP)
  1292.                   _ELEMS68K
  1293.                   move.w      ([sp],2),([sp])
  1294.                   clr.l       (sp)+
  1295.                   jsr         _fprocEXITsp
  1296.                   ENDM
  1297.  
  1298. ;———————————————————————————————————————————————————————————
  1299. ; Scanner and formatter operation code masks
  1300. ;———————————————————————————————————————————————————————————
  1301.  
  1302. FOPSTR2DEC        EQU         $0002                     ;Pascal string to decimal record
  1303. FOCSTR2DEC        EQU         $0004                     ;C string to decimal record
  1304. FODEC2STR         EQU         $0003                     ;decimal record to Pascal string
  1305.  
  1306. ;———————————————————————————————————————————————————————————
  1307. ; Scanner and formatter functions
  1308. ;———————————————————————————————————————————————————————————
  1309.  
  1310. ;Pascal string to decimal record
  1311.  
  1312.                   MACRO
  1313.                   FPSTR2DEC
  1314.                   MOVE.W      #FOPSTR2DEC, -(SP)
  1315.                   _DecStr68K
  1316.                   ENDM
  1317.  
  1318. ;C string to decimal record
  1319.  
  1320.                   MACRO
  1321.                   FCSTR2DEC
  1322.                   MOVE.W      #FOCSTR2DEC, -(SP)
  1323.                   _DecStr68K
  1324.                   ENDM
  1325.  
  1326. ;decimal record to Pascal string
  1327.  
  1328.                   MACRO
  1329.                   FDEC2STR
  1330.                   MOVE.W      #FODEC2STR, -(SP)
  1331.                   _DecStr68K
  1332.                   ENDM
  1333.  
  1334.  
  1335.  
  1336. ;———————————————————————————————————————————————————————————
  1337. ; NaN codes.
  1338. ;———————————————————————————————————————————————————————————
  1339. NANSQRT           EQU         1                         ; Invalid square root such as sqrt(-1).
  1340. NANADD            EQU         2                         ; Invalid addition such as +INF - +INF.
  1341. NANDIV            EQU         4                         ; Invalid division such as 0/0.
  1342. NANMUL            EQU         8                         ; Invalid multiply such as 0 * INF.
  1343. NANREM            EQU         9                         ; Invalid remainder or mod such as x REM 0.
  1344. NANASCBIN         EQU         17                        ; Attempt to convert invalid ASCII string.
  1345. NANCOMP           EQU         20                        ; Result of converting comp NaN to floating.
  1346. NANZERO           EQU         21                        ; Attempt to create a NaN with a zero code.
  1347. NANTRIG           EQU         33                        ; Invalid argument to trig routine.
  1348. NANINVTRIG        EQU         34                        ; Invalid argument to inverse trig routine.
  1349. NANLOG            EQU         36                        ; Invalid argument to log routine.
  1350. NANPOWER          EQU         37                        ; Invalid argument to x^i or x^y routine.
  1351. NANFINAN          EQU         38                        ; Invalid argument to financial function.
  1352. NANINIT           EQU         255                       ; Uninitialized storage.
  1353.  
  1354. *
  1355. *                 _FC2X       converts a comp to a 96 bit extended
  1356.                                                         ;
  1357. *                 push        comp addr, then push destination addr, then jsr _FC2X .
  1358. *                 The         addresses are NOT popped for you, i.e. the call is C style.
  1359. *
  1360. *                 The         extended result is also left in fp0.
  1361. *
  1362. *                 All         data and address registers are preserved.
  1363. *
  1364. _FC2X             PROC
  1365.                   movem.l     d0-d1,-(sp)
  1366.                   movem.l     ([16,sp]),d0-d1
  1367.                   tst.l       d1
  1368.                   bgt.s       @1
  1369.                   beq.s       @3
  1370.                   addq.l      #1,d0
  1371. @1                fmove.l     d0,fp0
  1372.                   fscale.w    #32,fp0
  1373.                   fadd.l      d1,fp0
  1374.                   bvc.s       @2
  1375.                   fadd.s      #"$5f800000",fp0
  1376. @2                movem.l     (sp)+,d0-d1
  1377.                   fmove.x     fp0,([4,sp])
  1378.                   rts
  1379. @3                neg.l       d0
  1380.                   bvs.s       @4
  1381.                   neg.l       d0
  1382.                   bra.s       @1
  1383. @4                fmove.s     #"nan(20)",fp0
  1384.                   bra.s       @2
  1385.                   ENDPROC
  1386.  
  1387. ;———————————————————————————————————————————————————————————
  1388. ; Procentry Special Macro. (Stack-based environment; doesn't change rnd and prec.)
  1389. ;———————————————————————————————————————————————————————————
  1390.                   MACRO
  1391.                   FPROCENTRYSP
  1392.                   fmovem.l    fpcr/fpsr,-(sp)
  1393.                   clr.l       -(sp)
  1394.                   move.l      4(sp),-(sp)
  1395.                   and.l       #$ff,(sp)
  1396.                   fmovem.l    (sp)+,fpcr/fpsr
  1397.                   ENDM
  1398.  
  1399. *
  1400. *                 Subroutines _fprocENTRYsp and _fprocEXITsp bracket two argument SANE ROM calls,
  1401. *                 causing     their software exceptions to happen in hardware.
  1402. *
  1403. *                 ENTRY:      STACK: rtnaddr < DSTaddr < SRCaddr
  1404. *                 EXIT:       STACK: DSTaddr < SRCaddr < FPCR < FPSR < (0).L < DSTaddr < SRCaddr
  1405. *
  1406. *                 All         data and address registers are preserved.  FP1 is scratched.
  1407. *
  1408. _fprocENTRYsp     PROC
  1409.                   fmovem.l    (sp)+,fpiar
  1410.  
  1411.                   clr.l       -(sp)
  1412.                   fmovem      (sp),fp0
  1413.                   FPROCENTRYSP
  1414.                   fmovem      fp0,-(sp)
  1415.                   clr.l       (sp)+
  1416.  
  1417.                   fmovem.l    fpiar,-(sp)
  1418.                   rts
  1419.                   ENDPROC
  1420.  
  1421. *
  1422. *                 Subroutines _fprocEXITsp and _fprocENTRYsp bracket two argument SANE ROM calls,
  1423. *                 causing     their software exceptions to happen in hardware.
  1424. *
  1425. *                 ENTRY:      STACK: rtnaddr < FPCR < FPSR < (0).L < DSTaddr < SRCaddr
  1426. *                 EXIT:       STACK:
  1427. *
  1428. *                 All         data and address registers are preserved.  FP1 is scratched.
  1429. *
  1430. _fprocEXITsp      PROC
  1431.                   FMOVE.W     D1,FP1
  1432.                   FMOVE.L     FPSR,-(SP)
  1433.                   MOVE.W      2(SP),D1
  1434.                   CLR.L       (SP)+
  1435.                   FMOVEM.L    4(SP),FPCR/FPSR
  1436.  
  1437.                   OR.W        D1,10(SP)
  1438.                   AND.W       5(SP),D1                  ; Yes, 5
  1439.                   FMOVE.L     8(SP),FPSR
  1440.  
  1441.                   TST.B       D1
  1442.                   BEQ.S       @1
  1443.                   FNOP
  1444.                   NOP
  1445.                   FSAVE       -(SP)
  1446.                   CLR.W       D1
  1447.                   MOVE.B      1(SP),D1
  1448.                   BCLR        #3,(SP,D1.W)
  1449.                   FRESTORE    (SP)+
  1450.                   FNOP
  1451. @1                FMOVE.W     FP1,D1
  1452.                   MOVE.L      (SP),20(SP)
  1453.                   ADDA.W      #20,SP
  1454.                   RTS
  1455.                   ENDPROC
  1456.  
  1457.     ENDIF    ; ...already included